/*
 * socket.c
 *
 *  Created on: 15/11/2011
 *      Author: alejandro
 */

#include <sys/socket.h>
#include "socket.h"
#include "configLoader.h"
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

extern conexion *poolDeConexiones;
extern tipoConfigPFS configPFS;

int buscarConexionDisponible(){
	int i;
	for(i=0;i<configPFS.maxCon;i++){
		if(poolDeConexiones[i].estado==disponible){
			poolDeConexiones[i].estado=noDisponible;
			return i;
		}
	}
	return -1;
}

int crearPoolDeConexiones(int puerto, char *direccion){
	int sockfd;
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd==-1){
		perror("El socket no se pudo crear");
		exit(1);
	}
	printf("El socket se creo bien\n");

	struct sockaddr_in address;
	memset(&address, 0, sizeof(address));
	address.sin_family = AF_INET;
	address.sin_addr.s_addr = inet_addr(direccion);
	address.sin_port = puerto;
	if(connect(sockfd, (struct sockaddr *) &address, sizeof(address))==-1){
		printf("No se pudo conectar a ip: %s puerto: %d\n", direccion, puerto);
		perror("Causa");
		exit(1);
	}

	poolDeConexiones[0].socket = sockfd;
	printf("Se conecto bien\n");
	if (handshakeFS(poolDeConexiones[0].socket) == 0) {
		int i, conectado = 1;

		for (i = 1; conectado < configPFS.maxCon; i++) {
			sockfd = socket(AF_INET, SOCK_STREAM, 0);
			if (sockfd != -1) {
				poolDeConexiones[conectado].socket = sockfd;
				if (connect(poolDeConexiones[i].socket,
						(struct sockaddr *) &address, sizeof(address)) == 0) {
					poolDeConexiones[conectado].estado = disponible;
					conectado++;
				} else {
					perror("Error de conexion");
					close(sockfd);
				}
			}
		}
		poolDeConexiones[0].estado = disponible;
		printf("creado el pool de conexiones\n");
	}else{
		exit(1);
	}
	return 0;
}
